package org.example.controller;

import org.example.otherObject.ResponseObject;
import org.example.service.imp.RedisServiceImp;
import org.example.util.HutoolUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 这个controller做 统计相关的操作
 */
@Controller
@RequestMapping("/count/")
public class CountController {
    @Autowired
    private HutoolUtil hutoolUtil;
    @Autowired
    private RedisServiceImp redisServiceImp;
    @GetMapping("dataPage")
    public String dataPage(){
        return "site/admin/data";
    }
    /**
     * 这个主要是处理 网站的 每日的 唯一访问数量
     * 每日：就是每天
     * 唯一：就是一个用户 额 ip地址 相同的ip算一个
     * uv：unique visitor
     * 主要是实现：通过利用redis中HyPerLogLog类型存储 统计也是利用HyperLogLog
     * key:日期 value：ip
     * @return
     */
    @ResponseBody
    @PostMapping("uvSearch")
    public ResponseObject uvCount(@RequestParam(value = "startDate",required = false) String startDate,@RequestParam(value = "endDate",required = false) String endDate){
        if (hutoolUtil.stringIsEmpty(startDate) & hutoolUtil.stringIsEmpty(endDate)){
            return handleResponseResult("0","请正确填写查询日期");
        }
        if (!startDate.contains("-") && !endDate.contains("-")){//这个处理有点问题 有bug 算了 反正项目到处是bug
            return handleResponseResult("0","请正确填写查询日期格式");
        }
        //这里有三种可能性
        //startDate有 endDate没有  查当前时间段吧   日期格式默认xxxx/xx/xx
        if (!hutoolUtil.stringIsEmpty(startDate) && !hutoolUtil.stringIsEmpty(endDate)){
            //查询一个时间区段  需要注意 前后差不能超过一个月 多了 额 就不查了
            String[] start = startDate.split("-");
            String[] end = endDate.split("-");
            //我是按照正常的参数来做的 如果不正常参数这里 可能有问题 具体问题具体解决

            //保证是同一年
            if (Integer.parseInt(start[0]) - Integer.parseInt(end[0])!=0){
                //前后年份差不为0 可能查询不是同一年
                return handleResponseResult("0","请正确填写查询日期格式");
            }
            //同一个月
            if (Integer.parseInt(start[1]) - Integer.parseInt(end[1])!=0){
                //前后年份差不为0 可能查询不是同一年
                return handleResponseResult("0","请正确填写查询日期格式");
            }
            // 查询不同的日期
            int s = Integer.parseInt(start[2]);
            int e = Integer.parseInt(end[2]);
            List<String> dates = new ArrayList<>();
            StringBuilder temp = new StringBuilder();
            temp.append(start[0]);
            temp.append("-");
            temp.append(start[1]);
            temp.append("-");
            String yearMonth = temp.toString();
            for (int i = s;i<=e;i++){
                String tempDate = yearMonth + i +"-uv";
                dates.add(tempDate);
            }
            long count = redisServiceImp.searchUniqueVisitorCount(dates);
            ResponseObject responseObject = handleResponseResult("1", String.valueOf(count));
            return responseObject;
        }else {
            //有一个为空 查询一个时间
            ResponseObject responseObject = new ResponseObject();
            responseObject.setCode("1");
            if (hutoolUtil.stringIsEmpty(startDate)){
                long count = redisServiceImp.searchUniqueVisitorCount(endDate+"-uv");
                responseObject.setMessage(count+"");
            }else {
                long count = redisServiceImp.searchUniqueVisitorCount(startDate+"-uv");
                responseObject.setMessage(count+"");
            }
            return responseObject;
        }

    }
    private ResponseObject handleResponseResult(String code,String message){
        ResponseObject responseObject = new ResponseObject();
        responseObject.setCode(code);
        responseObject.setMessage(message);
        return responseObject;
    }
    /**
     * 这个主要是处理 网站 每日的活跃用户
     * 每日：就是每天
     * 活跃用户：必须是登录过的用户 访问网站 用id记录
     * 主要是实现：通过利用redis的bitMap类型存储
     * key:日期：value：id>登录就是true
     * @return
     */
    @ResponseBody
    @PostMapping("dauSearch")
    public ResponseObject dauCount(@RequestParam(value = "startDate",required = false) String startDate,@RequestParam(value = "endDate",required = false) String endDate){
        //这个请求和上面的uv请求操作相似 可以 一个请求处理 HttpServletRequest判断请求类型
        if (hutoolUtil.stringIsEmpty(startDate) & hutoolUtil.stringIsEmpty(endDate)){
            return handleResponseResult("0","请正确填写查询日期");
        }
        if (!startDate.contains("-") && !endDate.contains("-")){//这个处理有点问题 有bug 算了 反正项目到处是bug
            return handleResponseResult("0","请正确填写查询日期格式");
        }
        //这里有三种可能性
        //startDate有 endDate没有  查当前时间段吧   日期格式默认xxxx/xx/xx
        if (!hutoolUtil.stringIsEmpty(startDate) && !hutoolUtil.stringIsEmpty(endDate)){
            //查询一个时间区段  需要注意 前后差不能超过一个月 多了 额 就不查了
            String[] start = startDate.split("-");
            String[] end = endDate.split("-");
            //我是按照正常的参数来做的 如果不正常参数这里 可能有问题 具体问题具体解决

            //保证是同一年
            if (Integer.parseInt(start[0]) - Integer.parseInt(end[0])!=0){
                //前后年份差不为0 可能查询不是同一年
                return handleResponseResult("0","请正确填写查询日期格式");
            }
            //同一个月
            if (Integer.parseInt(start[1]) - Integer.parseInt(end[1])!=0){
                //前后年份差不为0 可能查询不是同一年
                return handleResponseResult("0","请正确填写查询日期格式");
            }

            // 查询不同的日期
            int s = Integer.parseInt(start[2]);
            int e = Integer.parseInt(end[2]);
            if (s-e>0){
                return handleResponseResult("0","请正确填写日期顺序");
            }
            List<String> dates = new ArrayList<>();
            StringBuilder temp = new StringBuilder();
            temp.append(start[0]);
            temp.append("-");
            temp.append(start[1]);
            temp.append("-");
            String yearMonth = temp.toString();
            for (int i = s;i<=e;i++){
                String tempDate = yearMonth + i +"-dau";
                dates.add(tempDate);
            }
            long count = redisServiceImp.searchDailyActiveUserCount(dates);
            ResponseObject responseObject = handleResponseResult("1", String.valueOf(count));
            return responseObject;
        }else {
            //有一个为空 查询一个时间
            ResponseObject responseObject = new ResponseObject();
            responseObject.setCode("1");
            if (hutoolUtil.stringIsEmpty(startDate)){
                long count = redisServiceImp.searchDailyActiveUserCount(endDate+"-dau");
                responseObject.setMessage(count+"");
            }else {
                long count = redisServiceImp.searchDailyActiveUserCount(startDate+"-dau");
                responseObject.setMessage(count+"");
            }
            return responseObject;
        }
    }

}
